package cn.com.anypay.manager.common.enums;

/**
 * 微信认证错误枚举
 * 定义微信认证过程中可能出现的各种错误类型
 */
public enum WeChatAuthError {
    
    /**
     * 授权码无效
     */
    INVALID_CODE("40029", "授权码无效"),
    
    /**
     * 授权码已过期
     */
    CODE_EXPIRED("40030", "授权码已过期"),
    
    /**
     * 访问令牌已过期
     */
    ACCESS_TOKEN_EXPIRED("40001", "访问令牌已过期"),
    
    /**
     * OpenID无效
     */
    INVALID_OPENID("40003", "OpenID无效"),
    
    /**
     * AppID无效
     */
    INVALID_APPID("40013", "AppID无效"),
    
    /**
     * API调用频率限制
     */
    API_RATE_LIMIT("45011", "API调用频率限制"),
    
    /**
     * 网络连接错误
     */
    NETWORK_ERROR("50001", "网络连接错误"),
    
    /**
     * 配置错误
     */
    CONFIG_ERROR("50002", "微信应用配置错误"),
    
    /**
     * 用户取消授权
     */
    USER_CANCELLED("50003", "用户取消授权"),
    
    /**
     * 状态参数验证失败
     */
    INVALID_STATE("50004", "状态参数验证失败"),
    
    /**
     * 获取用户信息失败
     */
    USER_INFO_FAILED("50005", "获取用户信息失败"),
    
    /**
     * 微信API内部错误
     */
    WECHAT_API_ERROR("50006", "微信API内部错误"),
    
    /**
     * 未知错误
     */
    UNKNOWN_ERROR("50099", "未知错误");
    
    private final String code;
    private final String message;
    
    WeChatAuthError(String code, String message) {
        this.code = code;
        this.message = message;
    }
    
    public String getCode() {
        return code;
    }
    
    public String getMessage() {
        return message;
    }
    
    /**
     * 根据错误码获取错误枚举
     */
    public static WeChatAuthError fromCode(String code) {
        if (code == null) {
            return UNKNOWN_ERROR;
        }
        
        for (WeChatAuthError error : values()) {
            if (error.code.equals(code)) {
                return error;
            }
        }
        return UNKNOWN_ERROR;
    }
    
    /**
     * 获取用户友好的错误消息
     */
    public String getUserFriendlyMessage() {
        switch (this) {
            case INVALID_CODE:
            case CODE_EXPIRED:
                return "授权已过期，请重新扫码登录";
            case ACCESS_TOKEN_EXPIRED:
                return "登录已过期，请重新登录";
            case INVALID_OPENID:
            case INVALID_APPID:
                return "微信登录配置异常，请联系管理员";
            case API_RATE_LIMIT:
                return "登录请求过于频繁，请稍后重试";
            case NETWORK_ERROR:
                return "网络连接异常，请检查网络后重试";
            case CONFIG_ERROR:
                return "微信登录服务配置异常，请联系管理员";
            case USER_CANCELLED:
                return "您已取消微信授权";
            case INVALID_STATE:
                return "登录状态异常，请重新登录";
            case USER_INFO_FAILED:
                return "获取微信用户信息失败，请重试";
            case WECHAT_API_ERROR:
                return "微信服务暂时不可用，请稍后重试";
            default:
                return "微信登录失败，请稍后重试";
        }
    }
    
    /**
     * 判断是否为可重试的错误
     */
    public boolean isRetryable() {
        switch (this) {
            case NETWORK_ERROR:
            case API_RATE_LIMIT:
            case WECHAT_API_ERROR:
                return true;
            default:
                return false;
        }
    }
    
    /**
     * 判断是否为用户操作错误
     */
    public boolean isUserError() {
        switch (this) {
            case USER_CANCELLED:
            case INVALID_STATE:
                return true;
            default:
                return false;
        }
    }
    
    /**
     * 判断是否为系统配置错误
     */
    public boolean isConfigError() {
        switch (this) {
            case CONFIG_ERROR:
            case INVALID_APPID:
                return true;
            default:
                return false;
        }
    }
}